<?php
/**
 * URL一回保存用ヘルパ
 *
 * @author tanaka
 * @package
 * @subpackage
 */
class Controller_Action_Helper_UrlParamHolder extends Zend_Controller_Action_Helper_Abstract
{
	const SESSION_NAME_SPACE = '';

	/**
	 * @var Zend_Session_Namespace
	 */
	protected static $_session;

	/**
	 * URL
	 *
	 * @var string
	 */
	protected static $_url = '';
	
	protected $_paramStartString = '/';
	
	protected $_paramNextString = '/';
	
	protected $_paramValueString = '/';

	/**
	 * クエリストリングを作成します。
	 *
	 * @param array $param
	 * @return string
	 */
	public function createQueryString(array $params)
	{
		$result = '';

		$isFirst = true;

		foreach ($params as $key => $value) {
			if (strlen($value) == 0) continue;

			if ($isFirst) {
				$result .= $this->_paramStartString;
				$isFirst = false;
			}
			else {
				$result .= $this->_paramNextString;
			}
			$result .= $key . $this->_paramValueString . urlencode($value);
		}

		return $result;
	}

	/**
	 * コンストラクタ
	 *
	 * @return void
	 */
	public function __construct()
	{
		if (!self::$_session instanceof Zend_Session_Namespace) {
			self::$_session = new Zend_Session_Namespace($this->getName());

			if (isset(self::$_session->URL)) {
				self::$_url = self::$_session->URL;
				unset(self::$_session->URL);
			}
		}
	}

	/**
	 * パラメータ保存
	 * 
	 * @param string|array $param
	 * @return string
	 */
	public function save($param)
	{
		if (is_array($param)) {
			self::$_session->URL = $this->createQueryString($param);
			
			return self::$_session->URL;
		}
		
		if(!is_string($param)){
			throw new AppException('URLパラメータが不正');
		}
		
		self::$_session->URL = $param;
		return self::$_session->URL;
	}
	
	/**
	 * パラメータの取得
	 * 
	 * @return string
	 */
	public function get()
	{
		return self::$_url;
	}
	
	/**
	 * 現在のパラメータを取得
	 * 
	 * @return string
	 */
	public function getCurrent()
	{
		return isset(self::$_session->URL) ? self::$_session->URL : '';
	}

	/**
	 * ダイレクト
	 * 
	 * @param string|array optional $param
	 * @return string
	 */
	public function direct($param = null)
	{
		if (is_null($param)) {
			return $this->get();
		}
		
		return $this->save($param);
	}
}
